package com.vincent.redispractise.part02.seckill;

import com.vincent.redispractise.dbClass.service.SeckillVoucherService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Des 优惠券秒杀
 * @Date 2023年2月24日13:17:01
 * @Param  * @param null
 * @Return
 */
@Slf4j
@RestController
@RequestMapping(value = "/voucher")
public class Seckill {
    @Autowired
    private SeckillVoucherService seckillVoucherService;

    /**
     * @Des 秒杀优惠券(裸奔秒杀)-超卖场景
     * @Date 2023年2月24日13:38:34
     * @Param * @param null
     * @Return
     */
    @GetMapping("/seckill1")
    public String seckill1(@RequestParam Long id) {
        return seckillVoucherService.seckill1(id);
    }
    /**
     * @Des 解决超卖场景：【乐观锁：版本号法->CAS法】
     * @Date 2023年2月24日13:38:34
     * @Param * @param null
     * @Return
     */
    @GetMapping("/seckill2")
    public String seckill2(@RequestParam Long id) {
        return seckillVoucherService.seckill2(id);
    }
    /**
     * @Des 悲观锁解决多表多条件判断和操作的原子性
     * @Date 2023年2月24日13:38:34
     * @Param * @param null
     * @Return
     */
    @GetMapping("/seckill3")
    public String seckill3(@RequestParam("id") Long id,@RequestParam("userId") Long userId) {
        return seckillVoucherService.seckill3(id,userId);
    }
    /**
     * @Des 使用redis分布式锁[锁超时释放-添加线程标识]
     * @Date 2023年3月5日20:25:03
     * @Param * @param null
     * @Return
     */
    @GetMapping("/seckill4")
    public String seckill4(@RequestParam("id") Long id,@RequestParam("userId") Long userId) {
        return seckillVoucherService.seckill4(id,userId);
    }
    /**
     * @Des 使用redisson分布式锁[解决获取锁不可重试、锁不可重复、锁超时自动释放问题]
     * @Date 2023年3月14日23:25:10
     * @Param * @param null
     * @Return
     */
    @GetMapping("/seckill5")
    public String seckill5(@RequestParam("id") Long id,@RequestParam("userId") Long userId) {
        return seckillVoucherService.seckill5(id,userId);
    }

    /**
     * @Des 异步秒杀内存加载到reids中
     * @Date 2023年3月15日23:34:08
     * @Param * @param null
     * @Return
     */
    @GetMapping("/loadStock")
    public void loadStock(@RequestParam("id") Long id) {
        seckillVoucherService.loadStock(id);
    }
    /**
     * @Des 异步秒杀
     * @Date 2023年3月15日23:34:18
     * @Param * @param null
     * @Return
     */
    @GetMapping("/seckill6")
    public String seckill6(@RequestParam("id") Long id,@RequestParam("userId") Long userId) {
        return seckillVoucherService.seckill6(id,userId);
    }
}
